LoginSignup
8
10

More than 1 year has passed since last update.

Python関数の引数と返り値の型をチェックするデコレータ

Last updated at Posted at 2019-03-20

概要

Pythonで作った自作関数を使用する時に、意図しない利用や挙動を検出するために、引数と返り値の型をチェックするデコレータを作ってみた。
型アノテーションを利用するため、Python3が前提になります。
内容をログに出すことで、デバッグする際にも役立ちます。
※間違い等ありましたらご指摘お願いします。

方法

デコレータの定義

検証デコレータ
import inspect

def validate_func(func):
    def validate_func_wrapper(*args, **kwargs):
        sig = inspect.signature(func)
        args_value = sig.bind(*args, **kwargs)  # 引数名と値のdict

        # 引数の検証
        for args_name, args_value in args_value.arguments.items():
            args_type = sig.parameters[args_name].annotation
            # 型が指定されている(not empty)、かつ 型が一致していない場合エラー
            if args_type is not inspect._empty and type(args_value) != args_type:
                raise Exception('引数の型が異なります')

        results = func(*args, **kwargs)

        # 返り値の検証
        return_type = sig.return_annotation
        # 型が指定されている(not empty)、かつ型が一致していない場合エラー
        if return_type is not inspect._empty and type(results) != return_type:
            raise Exception('返り値の型が異なります')

        return results
    return validate_func_wrapper

使い方例

使い方例
@validate_func
def test(a:int, b:int = 2) -> int:
    return a + b

test(1)  # 正常終了
test(1.0)  # エラー

参考

8
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
10